Cloudformation의 함수를 정리했습니다. ( 1 )
안녕하세요, 임채정입니다.
저는 요즘에 Cloudformation 을 사용해서 리소스 작성을 많이 하고 있습니다.
이 때, 템플릿에서 사용하는 함수에 대해서 정리해두면 도움이 될 것 같아서 이번 블로그에서는 Cloudformation 템플릿에 사용할 수 있는 함수를 정리해보려고 합니다.
하나의 블로그에서 전부 설명하기에는 함수가 많이 때문에 2개로 나눠서 진행하려고 합니다.
이 블로그에서 다룰 함수는 아젠다를 확인해주세요.
Cloudformation의 함수를 정리했습니다. ( 2 )
아젠다
- Fn::Base64
- Fn::Cidr
- 조건 함수
- Fn::FindInMap
- Fn::GetAtt
- Fn::GetAZs
1. Fn::Base64
함수의 정의
Fn::Base64
함수는 입력 문자열의 Base64 표시 반환합니다.- 일반적으로
UserData
속성으로 인코딩된 데이터를 아마존 EC2 인스턴스에 전달하는 데 사용합니다. -
파라미터 (매개변수)
- valueToEncode
- Base64로 변환할 문자열 값
- valueToEncode
- 반환 값
- Base64로 표시된 원래 문자열
사용법
Fn::Base64: valueToEncode !Base64 valueToEncode
예시
EC2 인스턴스의 userdata 속성으로 인코딩된 데이터를 아마존 EC2 인스턴스에 전달할 때
#〜생략〜 DevAnsibleEC2: Type: AWS::EC2::Instance Properties: ImageId: !Ref AMIIDAnsible InstanceType: !Ref InstanceTypeAnsible DisableApiTermination: true IamInstanceProfile: !Ref ManagementEC2Profile BlockDeviceMappings: - DeviceName: "/dev/xvda" Ebs: VolumeType: gp2 VolumeSize: 8 KeyName: !Ref KeyName Monitoring: false UserData: !Base64 | #! /bin/bash yum update yum install git yum install ansible #〜생략〜
2. Fn::Cidr
함수의 정의
Fn::Cidr
함수는 CIDR 주소 블록의 Array 를 반환합니다.- 반환된 CIDR 블록의 수는
count
파라미터에 따라 달라집니다. -
파라미터 (매개변수)
- ipBlock
- 작은 CIDR 블록으로 분할되는 사용자 지정 CIDR 주소 블록
- count
- 생성되는 CIDR 개수
- 유효한 범위는 1~256
- cidrBits
- CIDR 에 대한 서브넷 비트수
- 예를 들어 이 파라미터에 대한 값으로 「8」을 지정하면 「/24」 마스크의 CIDR이 생성됨
- ipBlock
- 반환 값
- CIDR 주소 블록의 Array
사용법
Fn::Cidr: - ipBlock - count - cidrBits !Cidr [ ipBlock, count, cidrBits ]
예시
OUTPUT에서 VPC의 CIDR(192.168.0.0/16)을 기준으로 10개의 서브넷 마스크가 '/24'의 CIDR을 출력
#〜생략〜 Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 192.168.0.0/16 nableDnsSupport: true EnableDnsHostnames: true Outputs: Subnets: Description: Output Fn::Cidr Value: !Join [ ":", !Cidr [ 192.168.0.0/16, 10, 8 ] ]
3. 조건 함수
함수의 정의
- 조건 함수를 사용하여 스택 리소스를 조건부 생성
- 스택 생성 및 업데이트 시 선언하는 입력 파라미터를 기준으로 이 조건을 평가
Fn::And
Fn::And
는 AND 연산자의 역할- 포함할 수 있는 최소 조건수는 2, 최대치는 10
- 파라미터 (매개변수)
- condition
true
또는false
로 평과되는 조건
- condition
Fn::And: [condition] !And [condition]
Fn::Equals
- 두 값이 같은지 비교
- 두 값이 같으면
true
를 반환, 다르면false
를 반환 - 파라미터 (매개변수)
- value
- 비교하려는 유형의 값
- value
Fn::Equals: [value_1, value_2] !Equals [value_1, value_2]
Fn::If
- 지정된 조건이
true
로 평가될 경우 특정 값을 반환하고 지정된 조건이false
로 평가될 경우 다른 값을 반환 - 파라미터 (매개변수)
- condition_name
- 조건 섹션의 조건 참조
- 조건의 이름을 사용하여 조건을 참조
- value_if_true
- 지정된 조건이
true
로 평가될 경우 반환할 값
- 지정된 조건이
- value_if_false
- 지정된 조건이
false
로 평가될 경우 반환할 값
- 지정된 조건이
- condition_name
Fn::If: [condition_name, value_if_true, value_if_false] !If [condition_name, value_if_true, value_if_false]
Fn::Not
Fn::Not
는 NOT 연산자의 역할false
로 평가되는 조건에 대해서true
를 반환하고true
로 평가되는 조건에 대해서false
를 반환- 파라미터 (매개변수)
- condition
Fn::Equals
또는true
로 평가되는 조건
- condition
Fn::Not: [condition] !Not [condition]
Fn::Or
Fn::Or
는 OR 연산자의 역할- 지정된 모든 조건 중 하나라도 true로 평가되면
true
가 반환, 조건 모두 false로 평가될 경우false
가 반환 - 포함할 수 있는 최소 조건수는 2, 최대치는 10
- 파라미터 (매개변수)
- condition
true
또는false
로 평과되는 조건
- condition
Fn::Or: [condition, ...] !Or [condition, ...]
예시
AWSTemplateFormatVersion: "2010-09-09" Parameters: Env: Type: String Default: prod AllowedValues: - dev - prod Description: environment name. (dev or prod) Scope: Type: String Default: public AllowedValues: - public - private EC2Role: Type: String Description: enter the ec2 role name. KeyPair: Type: AWS::EC2::KeyPair::KeyName Description: KeyPair Name Conditions: IsProduction: !Equals [!Ref Env, "prod"] IsEC2Role: !Not [!Equals [!Ref EC2Role, ""]] IsPublic: !Equals [!Ref Scope, "public"] ProdAndPub: !And [!Equals [!Ref Env, "prod"], !Equals [!Ref Scope, "public"]] ProdOrPub: !Or [!Equals [!Ref Env, "prod"], !Equals [!Ref Scope, "public"]] Resources: EC2instance: Type: AWS::EC2::Instance Condition: IsPublic Properties: ImageId: ami-00000000 InstanceType: !If [IsProduction, "t2.micro", "t2.nano"] IamInstanceProfile: !If [IsEC2Role, !Ref EC2Role, !Ref "AWS::NoValue"] BlockDeviceMappings: - DeviceName: '/dev/xvda' Ebs: VolumeType: 'gp2' VolumeSize: 10 KeyName: !Ref KeyPair Tags: - Key: Name Value: !Sub "${AWS::StackName}-${Env}-${Scope}" Outputs: ProdAndPub: Value: !If [ProdAndPub, true, false] ProdOrPub: Value: !If [ProdOrPub, true, false]
4. Fn::FindInMap
함수의 정의
Fn::FindInMap
함수는Mappings
섹션에서 선언된 2수준 맵의 키에 해당하는 값을 반환합니다.-
파라미터 (매개변수)
- MapName
- 키 및 값이 포함된 매핑 섹션에서 선언된 매핑의 논리적 이름
- TopLevelKey
- 최상위 키의 이름
- 이 값은 키-값 페어 목록
- SecondLevelKey
TopLevelKey
에 할당된 목록의 키 중 하나로 설정된 두 번째 수준 키 이름
- MapName
- 반환 값
SecondLevelKey
에 할당된 값
사용법
Fn::FindInMap: [ MapName, TopLevelKey, SecondLevelKey ] !FindInMap [ MapName, TopLevelKey, SecondLevelKey ]
예시
Mappings 에 설정되어 있는 CIDR 값을 Fn::FindInMap
을 이용하여 리소스에 지정
#〜생략〜 Mappings: SubnetConfig: VPC: CIDR: '10.0.0.0/16' PublicOne: CIDR: '10.0.0.0/24' PublicTwo: CIDR: '10.0.1.0/24' PrivateOne: CIDR: '10.0.100.0/24' PrivateTwo: CIDR: '10.0.101.0/24' Resources: VPC: Type: AWS::EC2::VPC Properties: EnableDnsSupport: true EnableDnsHostnames: true CidrBlock: !FindInMap [SubnetConfig, VPC, CIDR] PublicSubnetOne: Type: AWS::EC2::Subnet Properties: #〜생략〜 CidrBlock: !FindInMap [SubnetConfig, PublicOne, CIDR] #〜생략〜
5. Fn::GetAtt
함수의 정의
Fn::GetAtt
함수는 템플릿의 리소스에서 속성 값을 반환합니다.-
파라미터 (매개변수)
- logicalNameOfResource
- 원하는 속성을 포함한 자원의 논리명 (논리적 ID라고도 함)
- attributeName
- 필요로 하는 값이 있는 리소스 고유 속성의 이름
- logicalNameOfResource
- 반환 값
- 속성 값
사용법
Fn::GetAtt: [ logicalNameOfResource, attributeName ] !GetAtt logicalNameOfResource.attributeName
예시
rds의 IAM Role Arn 의 값을 RDS 인스턴스에 설정
#〜생략〜 # ------------ # RDS IAM Role # ------------ RDSRole: Type: "AWS::IAM::Role" Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Principal: Service: - "monitoring.rds.amazonaws.com" Action: - "sts:AssumeRole" ManagedPolicyArns: - "arn:aws:iam::aws:policy/service-role/AmazonRDSMonitoringRole" Path: "/" RoleName: rds-monitoring-role #〜생략〜 # ------------ # PostgreSQL Instance # ------------ PostgreSQLDBInstance1: Type: "AWS::RDS::DBInstance" Properties: AutoMinorVersionUpgrade: false AvailabilityZone: "ap-northeast-1a" #〜생략〜 MonitoringInterval: 60 MonitoringRoleArn: !GetAtt RDSRole.Arn Engine: aurora-postgresql EngineVersion: "11.11" EnablePerformanceInsights: True #〜생략〜
6. Fn::GetAZs
함수의 정의
Fn::GetAZs
함수는 지정된 리전의 AZ를 알파벳 순으로 나열하는 Array를 반환합니다- 고객이 다른 AZ에 액세스할 수 있기 때문에 템플릿 작성자는
Fn::GetAZs
함수를 사용하여 호출하는 사용자의 액세스 권한으로 조정되는 템플릿을 만듭니다 -
파라미터 (매개변수)
- AZ를 가져올 지역 이름의 빈 문자열을 지정하면 「AWS::Region」 으로 지정
- 반환 값
- 리전의 AZ 리스트
사용법
Fn::GetAZs: region !GetAZs region
예시
Public Subnet에 AZ 를 지정할 때
#〜생략〜 # ----- # Public Subnet # ----- publicSubnet: Type: AWS::EC2::Subnet Properties: AvailabilityZone: !Select [ 0, !GetAZs '' ] CidrBlock: !Select [0, !Cidr [!GetAtt vpc.CidrBlock, 2, 8]] VpcId: 10.0.0.0/16 Tags: - Key: Name Value: public-subnet #〜생략〜
본 블로그 게시글을 보시고 문의 사항이 있으신 분들은 클래스메소드코리아 ([email protected])로 연락 주시면 빠른 시일 내 담당자가 회신 드릴 수 있도록 하겠습니다 !